import AppDispatcher from '../AppDispatcher.js';
import * as ActionTypes from '../ActionTypes.js';
import {EventEmitter} from 'events';
import CounterStore from './CounterStore.js';

//计算总和
function computeSummary(counterValues) {
	let summary = 0;
	for (let key in counterValues) {
		//hasOwnProperty()函数用于指示一个对象自身(不包括原型链)是否具有指定名称的属性。如果有，返回true，否则返回false
		if (counterValues.hasOwnProperty(key)) {
			summary += counterValues[key];
		}
	}
	return summary;
}

const CHANGE_EVENT = 'changed';

//在这里是把SummaryStore这个类复制了EventEmitter类中protoype的值//扩展了EventEmitter.prototype
//使得SummaryStore成了EventEmitter对象，一个EventEmitter对象支持下列函数
//emit函数，可以广播一个特定事件，第一个参数是字符串类型的事件名称
// on函数，可以增加一个挂在这个EventEmitter对象特定事件上的处理函数，第一个参数是字符串类型的事件名称，第二个参数是处理函数
// removeListener函数，和on函数做的事情相反，删除挂在这个EventEmitter对象特定事件上的处理函数，和on函数一样，第一个参数是事件名称，第二个参数是处理函数，要注意，如果要调用removeListener函数就一定要保留对处理函数的引用
const SummaryStore = Object.assign({}, EventEmitter.prototype, {

	//获取值
	getSummary: function () {
		return computeSummary(CounterStore.getCounterValues());//这个store并没有储存自己的状态，当gitSummary被调用时他是直接从CounterStore里获取状态计算
		//可见一个store不表示不许要存储什么东西，store只是提供获取数据的方法，而store提供的数据完全可以另一个store计算得来
	},

	//
	emitChange: function () {
		this.emit(CHANGE_EVENT);
	},

	//
	addChangeListener: function (callback) {
		this.on(CHANGE_EVENT, callback);
	},

	removeChangeListener: function (callback) {
		this.removeListener(CHANGE_EVENT, callback);
	},
}) 


//无论是做了什么操作，都要调用emitChange函数如果有调用者通过SummaryStore.addChangeListner关注了SummaryStore的状态变化，这个emitChange函数调用就会引发监听函数的执行
SummaryStore.dispatchToken = AppDispatcher.register( (action) => {
	if (action.type === ActionTypes.INCREMENT || action.type === ActionTypes.DECREMENT) {
		//这里使用了waitFor函数，解决调用各个回调函数的顺序
		//这时CounterStore中注册的回调函数保存下来的dispatchToken终于派上用场了
		//waitFor可以接受一个数组作为参数数组中的每个参数都是一个Dispatcherher.refister()函数返回结果也就是所谓的dispatchToken。这个waitFor函数告诉Dispatcher，当前的处理必须要暂停。直到dispatchToken代表的那些 已注册回调函数执行结束才能继续
		AppDispatcher.waitFor([CounterStore.dispatchToken])
		SummaryStore.emitChange();
	} 
} )

export default SummaryStore;